package com.example.lib_net.test_okhttp

import okhttp3.Call
import okhttp3.Callback
import okhttp3.OkHttp
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.Response
import okhttp3.logging.HttpLoggingInterceptor
import java.io.IOException
import java.util.concurrent.TimeUnit

/**
Okhttp源码解析
1.创建OkhttpClient.Buider():里面初始化一些重要属性
dispatcher调度器：三个任务队列(正在运行的同步任务队列/正在运行异步任务队列/准备执行异步任务队列)+线程池
connectionPool：连接池，网络连接可以进行复用，最多5个，每个链接最终保持5分钟
connectTimeOut/readTimeOut/wriiteTimeOut：默认十秒

2.创建request对象：url网址/请求方式默认是get/请求头/请求体/tag
3.client发起request得到RealCall
4.同步和异步：
同步：execute()方法：调用dispatcher调度器将RealCall放在正在运行的同步任务队列中
异步：enqueue()方法：调用dispatcher调度器判断正在执行的异步任务队列是否超过最大requet数量64，若超过将Call放在准备异步任务队列，若没超过将Call放在正在异步任务队列中并交给线程池执行该任务

5.无论是同步还是异步都会执行getResponseWithInterceptorChain()获得最终的response结果
（1）里面7种拦截器：自定义Inteceptor—》重连和重定向拦截器—〉桥拦截器(gZip)—>缓存拦截器—>链接拦截器->自定义NetWorkInteceptor-》CallServerInteceptor真正发送数据和读取数据
（2）将7种拦截封装在责任链中，最后执行得到response结果
 */
class OkhttpDemo {
    fun okhttp(){
        //client
        val client = OkHttpClient.Builder()
            .addInterceptor(HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY))
//            .addNetworkInterceptor()
            .readTimeout(10, TimeUnit.SECONDS)
            .build()



        //request
        val request = Request.Builder()
            .url("")
            .get()
            .header("","")
            .build()



        //call
        val call = client.newCall(request)



        //异步->response
        call.enqueue(object : Callback {
            override fun onFailure(call: Call, e: IOException) {

            }

            override fun onResponse(call: Call, response: Response) {
                //

            }
        })

        //同步->response
        val response = call.execute()



    }


}